﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using InterfazGrafico.LibreriaClases.Clases;
using InterfazGrafico.LibreriaConstantes;
using InterfazGrafico.LibreriaConstantes.Elementos;

namespace InterfazGrafico.LibreriaClases.Propiedades
{
    /// <summary>
    /// Almacena las propiedades de un elemento específico.
    /// </summary>
    public class PDefinicionRegistro : Propiedades
    {
        /// <summary>
        /// Diccionario Patrones.
        /// </summary>
        public Dictionary<string, Dictionary<string, List<string>>> DiccionarioPatrones
        {
            get
            {
                if (!this.contienePropiedad(CDefinicionRegistro.DiccionarioPatrones))
                    this.addPropiedad(CDefinicionRegistro.DiccionarioPatrones, new Dictionary<string, Dictionary<string, List<string>>>());
                return (Dictionary<string, Dictionary<string, List<string>>>)this.getPropiedad(CDefinicionRegistro.DiccionarioPatrones);
            }
            set
            {
                this.setOrAddPropiedad(CDefinicionRegistro.DiccionarioPatrones, value);
            }
        }

        /// <summary>
        /// Constructor por defecto.
        /// </summary>
        public PDefinicionRegistro()
            : base()
        {
        }

        /// <summary>
        /// Obtiene los parámetros a partir del fichero XML indicado.
        /// </summary>
        /// <param name="fichero">Fichero de configuración XML</param>
        override public void leer(string fichero)
        {
            try
            {
                base.leer(fichero);
                XmlDocument xml = LeerXml.AbrirFicheroParametros(fichero);
                try
                {
                    // Formatos de registros
                    int numeroRegistros = 0;
                    try
                    { numeroRegistros = LeerXml.ObtenerNumeroNodosCampo(xml, CDefinicionRegistro.RutaNodoRaiz); }
                    catch (Exception)
                    { numeroRegistros = 0; };
                    this.DiccionarioPatrones = new Dictionary<string, Dictionary<string, List<string>>>();
                    for (int indiceRegistro = 0; indiceRegistro < numeroRegistros; indiceRegistro++)
                    {
                        // Formato
                        string formato = string.Empty;
                        try
                        { formato = LeerXml.ObtenerValorCampo(xml, CDefinicionRegistro.RutaNodoRaiz, indiceRegistro, CDefinicionRegistro.NodoRegistroFormato); }
                        catch (Exception)
                        { formato = string.Empty; }
                        // Alias
                        Dictionary<string, List<string>> diccionario = new Dictionary<string, List<string>>();
                        int numeroAlias = 0;
                        try
                        { numeroAlias = LeerXml.ObtenerNumeroNodosCampo(xml, CDefinicionRegistro.RutaNodoRaiz, indiceRegistro, CDefinicionRegistro.NodoRegistroListaAlias); }
                        catch (Exception)
                        { numeroAlias = 0; }
                        for (int indiceAlias = 0; indiceAlias < numeroAlias; indiceAlias++)
                        {
                            // Nombre alias
                            string alias = string.Empty;
                            try
                            { alias = LeerXml.ObtenerValorCampo(xml, CDefinicionRegistro.RutaNodoRaiz, indiceRegistro, CDefinicionRegistro.NodoRegistroListaAlias, indiceAlias, CDefinicionRegistro.NodoRegistroListaAliasAliasNombre); }
                            catch (Exception)
                            { alias = string.Empty; }
                            // Campos del alias
                            List<string> campos = new List<string>();
                            int numeroCampos = 0;
                            try
                            { numeroCampos = LeerXml.ObtenerNumeroNodosCampo(xml, CDefinicionRegistro.RutaNodoRaiz, indiceRegistro, CDefinicionRegistro.NodoRegistroListaAlias, indiceAlias, CDefinicionRegistro.NodoRegistroListaAliasAliasSalida); }
                            catch (Exception)
                            { numeroCampos = 0; }
                            for (int indiceCampo = 0; indiceCampo < numeroCampos; indiceCampo++)
                            {
                                string campo = string.Empty;
                                try
                                { campo = LeerXml.ObtenerValorCampo(xml, CDefinicionRegistro.RutaNodoRaiz, indiceRegistro, CDefinicionRegistro.NodoRegistroListaAlias, indiceAlias, CDefinicionRegistro.NodoRegistroListaAliasAliasSalida, indiceCampo); }
                                catch (Exception)
                                { campo = string.Empty; }
                                campos.Add(campo);
                            }
                            diccionario.Add(alias, campos);
                        }
                        if (!string.Empty.Equals(formato))
                            this.DiccionarioPatrones.Add(formato, diccionario);
                    }
                }
                catch (Exception)
                {
                    this.DiccionarioPatrones = new Dictionary<string, Dictionary<string, List<string>>>();
                }
            }
            catch (Exception ex)
            {
                throw new ApplicationException(Constantes.ERROR_LECTURA_FICHERO_CONFIGURACION, ex);
            }
        }

        /// <summary>
        /// Escribe los parámetros al fichero XML indicado.
        /// </summary>
        /// <param name="fichero">Fichero de configuración XML</param>
        public override void escribir(string fichero)
        {
            try
            {
                base.escribir(fichero);
                XmlWriter xml = EscribirXml.AbrirFicheroParametros(fichero);
                EscribirXml.InicioElemento(xml, CDefinicionRegistro.NodoRaiz);
                foreach (string registro in DiccionarioPatrones.Keys)
                {
                    EscribirXml.InicioElemento(xml, CDefinicionRegistro.NodoRegistro);
                    // Formato
                    EscribirXml.EscribeNodo(xml, CDefinicionRegistro.NodoRegistroFormato, registro);
                    // Lista alias
                    EscribirXml.InicioElemento(xml, CDefinicionRegistro.NodoRegistroListaAlias);
                    foreach (string alias in DiccionarioPatrones[registro].Keys)
                    {
                        EscribirXml.InicioElemento(xml, CDefinicionRegistro.NodoRegistroListaAliasAlias);
                        // alias
                        EscribirXml.EscribeNodo(xml, CDefinicionRegistro.NodoRegistroListaAliasAliasNombre, alias);
                        // salida
                        EscribirXml.InicioElemento(xml, CDefinicionRegistro.NodoRegistroListaAliasAliasSalida);
                        foreach (string campo in DiccionarioPatrones[registro][alias])
                            EscribirXml.EscribeNodo(xml, CDefinicionRegistro.NodoRegistroListaAliasAliasSalidaCampo, campo);
                        EscribirXml.FinElemento(xml);
                        EscribirXml.FinElemento(xml);
                    }
                    EscribirXml.FinElemento(xml);
                    EscribirXml.FinElemento(xml);
                }
                EscribirXml.FinElemento(xml);
                EscribirXml.Flush(xml);
                EscribirXml.Close(xml);
            }
            catch (Exception ex)
            {
                throw new ApplicationException(Constantes.ERROR_ESCRITURA_FICHERO_CONFIGURACION, ex);
            }
        }
    }
}

 